#if !defined(__APP_MESSAGE_H__)
#define __APP_MESSAGE_H__

typedef enum {
    BLUETOOTH = 1,
    LORA = 2,
    OTHER
} ConnectionType;

/**
 * 在消息结构体中，ptr缓冲区前id_len字节属于id，紧接着msg_len字节属于内容
 */
typedef struct MessageStruct
{
    ConnectionType connection_type;
    unsigned char id_len;
    unsigned char msg_len;
    unsigned char *ptr;
} Message;

/**
 * @brief 从二进制中创建消息，约定：2进制格式为：第一字节为id_len，第二字节为msg_len, 紧接着是id二进制，紧接着是msg二进制
 * 
 * @param message 消息结构体
 * @param buf 二进制指针
 * @param len 缓冲区长度
 * @return int 0成功 -1失败
 */
int app_message_initByBinary(Message *message, ConnectionType connection_type, void *buf, int len);

/**
 * @brief 从json_str中创建消息
 * 
 * @param message 消息结构体
 * @param json_str json串指针
 * @return int 0成功 -1失败
 */
int app_message_initByJsonStr(Message *message, char* json_str);

/**
 * @brief 将消息序列号为二进制数据
 * 
 * @param message 消息
 * @param buf 序列化缓存区指针
 * @param len 缓存区长度
 * @return int -1失败， 成功返回序列化实际长度
 */
int app_message_saveBinary(Message* message, void * buf, int len);

/**
 * @brief 将消息序列化为Json字符串
 * 
 * @param message 消息结构体
 * @param json_buf 缓冲区指针
 * @param len 缓冲区长度
 * @return int 成功0,失败-1
 */
int app_message_saveJson(Message *message, char* json_buf, int len);

/**
 * @brief 释放消息的内存
 * 
 * @param message 
 */
void app_message_free(Message *message);

#endif // __APP_MESSAGE_H__
